<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/kref.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/kref.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/*</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> * kref.h - library routines for handling generic reference counted objects</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> *</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * Copyright (C) 2004 Greg Kroah-Hartman &lt;greg@kroah.com&gt;</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> * Copyright (C) 2004 IBM Corp.</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> *</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> * based on kobject.h which was:</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> * Copyright (C) 2002-2003 Patrick Mochel &lt;mochel@osdl.org&gt;</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> * Copyright (C) 2002-2003 Open Source Development Labs</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> *</span>
<a name="11" /><span class="True">      11:</span> <span class="k"> * This file is released under the GPLv2.</span>
<a name="12" /><span class="True">      12:</span> <span class="k"> *</span>
<a name="13" /><span class="True">      13:</span> <span class="k"> */</span>
<a name="14" /><span class="True">      14:</span> 
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0tSRUZfSF9fMA__"><span class="b">_KREF_H_</span></a>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0tSRUZfSF9fMA__"><span class="b">_KREF_H_</span></a>
<a name="17" /><span class="Maybe">      17:</span> 
<a name="18" /><span class="Maybe">      18:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">bug</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">atomic</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">kernel</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">mutex</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">spinlock</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="23" /><span class="Maybe">      23:</span> 
<a name="24" /><span class="Maybe">      24:</span> <span class="m">struct</span> <span class="b">kref</span> <span class="f">{</span>
<a name="25" /><span class="Maybe">      25:</span>     <span class="b">atomic_t</span> <span class="b">refcount</span><span class="f">;</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="f">}</span><span class="f">;</span>
<a name="27" /><span class="Maybe">      27:</span> 
<a name="28" /><span class="Maybe">      28:</span> <span class="k">/**</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> * kref_init - initialize object.</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="k"> * @kref: object in question.</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="k"> */</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">kref_init</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="f">{</span>
<a name="34" /><span class="Maybe">      34:</span>     <span class="b">atomic_set</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="f">}</span>
<a name="36" /><span class="Maybe">      36:</span> 
<a name="37" /><span class="Maybe">      37:</span> <span class="k">/**</span>
<a name="38" /><span class="Maybe">      38:</span> <span class="k"> * kref_get - increment refcount for object.</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="k"> * @kref: object.</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="k"> */</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">void</span> <span class="b">kref_get</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span>
<a name="42" /><span class="Maybe">      42:</span> <span class="f">{</span>
<a name="43" /><span class="Maybe">      43:</span>     <span class="k">/* If refcount was 0 before incrementing then we have a race</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="k">     * condition when this kref is freeing by some other thread right now.</span>
<a name="45" /><span class="Maybe">      45:</span> <span class="k">     * In this case one should use kref_get_unless_zero()</span>
<a name="46" /><span class="Maybe">      46:</span> <span class="k">     */</span>
<a name="47" /><span class="Maybe">      47:</span>     <a href="cpu.c_macros_ref.html#_V0FSTl9PTl9PTkNFXzA_"><span class="b">WARN_ON_ONCE</span></a><span class="f">(</span><a href="cpu.c_macros_ref.html#_YXRvbWljX2luY19yZXR1cm5fMA__"><span class="b">atomic_inc_return</span></a><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">)</span> <span class="f">&lt;</span> <span class="c">2</span><span class="f">)</span><span class="f">;</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="f">}</span>
<a name="49" /><span class="Maybe">      49:</span> 
<a name="50" /><span class="Maybe">      50:</span> <span class="k">/**</span>
<a name="51" /><span class="Maybe">      51:</span> <span class="k"> * kref_sub - subtract a number of refcounts for object.</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="k"> * @kref: object.</span>
<a name="53" /><span class="Maybe">      53:</span> <span class="k"> * @count: Number of recounts to subtract.</span>
<a name="54" /><span class="Maybe">      54:</span> <span class="k"> * @release: pointer to the function that will clean up the object when the</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="k"> *         last reference to the object is released.</span>
<a name="56" /><span class="Maybe">      56:</span> <span class="k"> *         This pointer is required, and it is not acceptable to pass kfree</span>
<a name="57" /><span class="Maybe">      57:</span> <span class="k"> *         in as this function.  If the caller does pass kfree to this</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="k"> *         function, you will be publicly mocked mercilessly by the kref</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="k"> *         maintainer, and anyone else who happens to notice it.  You have</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="k"> *         been warned.</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="k"> *</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="k"> * Subtract @count from the refcount, and if 0, call release().</span>
<a name="63" /><span class="Maybe">      63:</span> <span class="k"> * Return 1 if the object was removed, otherwise return 0.  Beware, if this</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="k"> * function returns 0, you still can not count on the kref from remaining in</span>
<a name="65" /><span class="Maybe">      65:</span> <span class="k"> * memory.  Only use the return value if you want to see if the kref is now</span>
<a name="66" /><span class="Maybe">      66:</span> <span class="k"> * gone, not present.</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="k"> */</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">kref_sub</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">,</span> <span class="m">unsigned</span> <span class="m">int</span> <span class="b">count</span><span class="f">,</span>
<a name="69" /><span class="Maybe">      69:</span>          <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">release</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span><span class="f">)</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="f">{</span>
<a name="71" /><span class="Maybe">      71:</span>     <a href="cpu.c_macros_ref.html#_V0FSTl9PTl8w"><span class="b">WARN_ON</span></a><span class="f">(</span><span class="b">release</span> <span class="f">==</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span><span class="f">;</span>
<a name="72" /><span class="Maybe">      72:</span> 
<a name="73" /><span class="Maybe">      73:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">atomic_sub_and_test</span><span class="f">(</span><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">count</span><span class="f">,</span> <span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="74" /><span class="Maybe">      74:</span>         <span class="b">release</span><span class="f">(</span><span class="b">kref</span><span class="f">)</span><span class="f">;</span>
<a name="75" /><span class="Maybe">      75:</span>         <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="76" /><span class="Maybe">      76:</span>     <span class="f">}</span>
<a name="77" /><span class="Maybe">      77:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="f">}</span>
<a name="79" /><span class="Maybe">      79:</span> 
<a name="80" /><span class="Maybe">      80:</span> <span class="k">/**</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> * kref_put - decrement refcount for object.</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> * @kref: object.</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> * @release: pointer to the function that will clean up the object when the</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> *         last reference to the object is released.</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="k"> *         This pointer is required, and it is not acceptable to pass kfree</span>
<a name="86" /><span class="Maybe">      86:</span> <span class="k"> *         in as this function.  If the caller does pass kfree to this</span>
<a name="87" /><span class="Maybe">      87:</span> <span class="k"> *         function, you will be publicly mocked mercilessly by the kref</span>
<a name="88" /><span class="Maybe">      88:</span> <span class="k"> *         maintainer, and anyone else who happens to notice it.  You have</span>
<a name="89" /><span class="Maybe">      89:</span> <span class="k"> *         been warned.</span>
<a name="90" /><span class="Maybe">      90:</span> <span class="k"> *</span>
<a name="91" /><span class="Maybe">      91:</span> <span class="k"> * Decrement the refcount, and if 0, call release().</span>
<a name="92" /><span class="Maybe">      92:</span> <span class="k"> * Return 1 if the object was removed, otherwise return 0.  Beware, if this</span>
<a name="93" /><span class="Maybe">      93:</span> <span class="k"> * function returns 0, you still can not count on the kref from remaining in</span>
<a name="94" /><span class="Maybe">      94:</span> <span class="k"> * memory.  Only use the return value if you want to see if the kref is now</span>
<a name="95" /><span class="Maybe">      95:</span> <span class="k"> * gone, not present.</span>
<a name="96" /><span class="Maybe">      96:</span> <span class="k"> */</span>
<a name="97" /><span class="Maybe">      97:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">kref_put</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">,</span> <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">release</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span><span class="f">)</span>
<a name="98" /><span class="Maybe">      98:</span> <span class="f">{</span>
<a name="99" /><span class="Maybe">      99:</span>     <span class="m">return</span> <span class="b">kref_sub</span><span class="f">(</span><span class="b">kref</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="b">release</span><span class="f">)</span><span class="f">;</span>
<a name="100" /><span class="Maybe">     100:</span> <span class="f">}</span>
<a name="101" /><span class="Maybe">     101:</span> 
<a name="102" /><span class="Maybe">     102:</span> <span class="k">/**</span>
<a name="103" /><span class="Maybe">     103:</span> <span class="k"> * kref_put_spinlock_irqsave - decrement refcount for object.</span>
<a name="104" /><span class="Maybe">     104:</span> <span class="k"> * @kref: object.</span>
<a name="105" /><span class="Maybe">     105:</span> <span class="k"> * @release: pointer to the function that will clean up the object when the</span>
<a name="106" /><span class="Maybe">     106:</span> <span class="k"> *         last reference to the object is released.</span>
<a name="107" /><span class="Maybe">     107:</span> <span class="k"> *         This pointer is required, and it is not acceptable to pass kfree</span>
<a name="108" /><span class="Maybe">     108:</span> <span class="k"> *         in as this function.</span>
<a name="109" /><span class="Maybe">     109:</span> <span class="k"> * @lock: lock to take in release case</span>
<a name="110" /><span class="Maybe">     110:</span> <span class="k"> *</span>
<a name="111" /><span class="Maybe">     111:</span> <span class="k"> * Behaves identical to kref_put with one exception.  If the reference count</span>
<a name="112" /><span class="Maybe">     112:</span> <span class="k"> * drops to zero, the lock will be taken atomically wrt dropping the reference</span>
<a name="113" /><span class="Maybe">     113:</span> <span class="k"> * count.  The release function has to call spin_unlock() without _irqrestore.</span>
<a name="114" /><span class="Maybe">     114:</span> <span class="k"> */</span>
<a name="115" /><span class="Maybe">     115:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">kref_put_spinlock_irqsave</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">,</span>
<a name="116" /><span class="Maybe">     116:</span>         <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">release</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span><span class="f">,</span>
<a name="117" /><span class="Maybe">     117:</span>         <span class="b">spinlock_t</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span>
<a name="118" /><span class="Maybe">     118:</span> <span class="f">{</span>
<a name="119" /><span class="Maybe">     119:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">flags</span><span class="f">;</span>
<a name="120" /><span class="Maybe">     120:</span> 
<a name="121" /><span class="Maybe">     121:</span>     <a href="cpu.c_macros_ref.html#_V0FSTl9PTl8w"><span class="b">WARN_ON</span></a><span class="f">(</span><span class="b">release</span> <span class="f">==</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span><span class="f">;</span>
<a name="122" /><span class="Maybe">     122:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">atomic_add_unless</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">,</span> <span class="f">-</span><span class="c">1</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>
<a name="123" /><span class="Maybe">     123:</span>         <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="124" /><span class="Maybe">     124:</span>     <a href="cpu.c_macros_ref.html#_c3Bpbl9sb2NrX2lycXNhdmVfMA__"><span class="b">spin_lock_irqsave</span></a><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="125" /><span class="Maybe">     125:</span>     <span class="m">if</span> <span class="f">(</span><span class="b">atomic_dec_and_test</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="126" /><span class="Maybe">     126:</span>         <span class="b">release</span><span class="f">(</span><span class="b">kref</span><span class="f">)</span><span class="f">;</span>
<a name="127" /><span class="Maybe">     127:</span>         <a href="cpu.c_macros_ref.html#_bG9jYWxfaXJxX3Jlc3RvcmVfMA__"><span class="b">local_irq_restore</span></a><span class="f">(</span><span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="128" /><span class="Maybe">     128:</span>         <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="129" /><span class="Maybe">     129:</span>     <span class="f">}</span>
<a name="130" /><span class="Maybe">     130:</span>     <span class="b">spin_unlock_irqrestore</span><span class="f">(</span><span class="b">lock</span><span class="f">,</span> <span class="b">flags</span><span class="f">)</span><span class="f">;</span>
<a name="131" /><span class="Maybe">     131:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="132" /><span class="Maybe">     132:</span> <span class="f">}</span>
<a name="133" /><span class="Maybe">     133:</span> 
<a name="134" /><span class="Maybe">     134:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <span class="b">kref_put_mutex</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">,</span>
<a name="135" /><span class="Maybe">     135:</span>                  <span class="m">void</span> <span class="f">(</span><span class="f">*</span><span class="b">release</span><span class="f">)</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span><span class="f">,</span>
<a name="136" /><span class="Maybe">     136:</span>                  <span class="m">struct</span> <span class="b">mutex</span> <span class="f">*</span><span class="b">lock</span><span class="f">)</span>
<a name="137" /><span class="Maybe">     137:</span> <span class="f">{</span>
<a name="138" /><span class="Maybe">     138:</span>     <a href="cpu.c_macros_ref.html#_V0FSTl9PTl8w"><span class="b">WARN_ON</span></a><span class="f">(</span><span class="b">release</span> <span class="f">==</span> <a href="cpu.c_macros_ref.html#_TlVMTF8w"><span class="b">NULL</span></a><span class="f">)</span><span class="f">;</span>
<a name="139" /><span class="Maybe">     139:</span>     <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="f">!</span><span class="b">atomic_add_unless</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">,</span> <span class="f">-</span><span class="c">1</span><span class="f">,</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="140" /><span class="Maybe">     140:</span>         <span class="b">mutex_lock</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="141" /><span class="Maybe">     141:</span>         <span class="m">if</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_dW5saWtlbHlfMA__"><span class="b">unlikely</span></a><span class="f">(</span><span class="f">!</span><span class="b">atomic_dec_and_test</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">{</span>
<a name="142" /><span class="Maybe">     142:</span>             <span class="b">mutex_unlock</span><span class="f">(</span><span class="b">lock</span><span class="f">)</span><span class="f">;</span>
<a name="143" /><span class="Maybe">     143:</span>             <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="144" /><span class="Maybe">     144:</span>         <span class="f">}</span>
<a name="145" /><span class="Maybe">     145:</span>         <span class="b">release</span><span class="f">(</span><span class="b">kref</span><span class="f">)</span><span class="f">;</span>
<a name="146" /><span class="Maybe">     146:</span>         <span class="m">return</span> <span class="c">1</span><span class="f">;</span>
<a name="147" /><span class="Maybe">     147:</span>     <span class="f">}</span>
<a name="148" /><span class="Maybe">     148:</span>     <span class="m">return</span> <span class="c">0</span><span class="f">;</span>
<a name="149" /><span class="Maybe">     149:</span> <span class="f">}</span>
<a name="150" /><span class="Maybe">     150:</span> 
<a name="151" /><span class="Maybe">     151:</span> <span class="k">/**</span>
<a name="152" /><span class="Maybe">     152:</span> <span class="k"> * kref_get_unless_zero - Increment refcount for object unless it is zero.</span>
<a name="153" /><span class="Maybe">     153:</span> <span class="k"> * @kref: object.</span>
<a name="154" /><span class="Maybe">     154:</span> <span class="k"> *</span>
<a name="155" /><span class="Maybe">     155:</span> <span class="k"> * Return non-zero if the increment succeeded. Otherwise return 0.</span>
<a name="156" /><span class="Maybe">     156:</span> <span class="k"> *</span>
<a name="157" /><span class="Maybe">     157:</span> <span class="k"> * This function is intended to simplify locking around refcounting for</span>
<a name="158" /><span class="Maybe">     158:</span> <span class="k"> * objects that can be looked up from a lookup structure, and which are</span>
<a name="159" /><span class="Maybe">     159:</span> <span class="k"> * removed from that lookup structure in the object destructor.</span>
<a name="160" /><span class="Maybe">     160:</span> <span class="k"> * Operations on such objects require at least a read lock around</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="k"> * lookup + kref_get, and a write lock around kref_put + remove from lookup</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k"> * structure. Furthermore, RCU implementations become extremely tricky.</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="k"> * With a lookup followed by a kref_get_unless_zero *with return value check*</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="k"> * locking in the kref_put path can be deferred to the actual removal from</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="k"> * the lookup structure and RCU lookups become trivial.</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="k"> */</span>
<a name="167" /><span class="Maybe">     167:</span> <span class="m">static</span> <span class="m">inline</span> <span class="m">int</span> <a href="cpu.c_macros_ref.html#_X19tdXN0X2NoZWNrXzE_"><span class="b">__must_check</span></a> <span class="b">kref_get_unless_zero</span><span class="f">(</span><span class="m">struct</span> <span class="b">kref</span> <span class="f">*</span><span class="b">kref</span><span class="f">)</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="f">{</span>
<a name="169" /><span class="Maybe">     169:</span>     <span class="m">return</span> <span class="b">atomic_add_unless</span><span class="f">(</span><span class="f">&amp;</span><span class="b">kref</span><span class="f">-&gt;</span><span class="b">refcount</span><span class="f">,</span> <span class="c">1</span><span class="f">,</span> <span class="c">0</span><span class="f">)</span><span class="f">;</span>
<a name="170" /><span class="Maybe">     170:</span> <span class="f">}</span>
<a name="171" /><span class="True">     171:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _KREF_H_ */</span>
<a name="172" /><span class="True">     172:</span> </pre>
  </body>
</html>
